class Solution {
public:
    int maxHeightOfTriangle(int red, int blue) {
        // 用一个长为 2 的 cnt 数组，分别记录偶数行和奇数行分别放了多少个球
        // 从 i=1 开始枚举，如果 i 是奇数则把 cnt[1] 增加 i，如果 i 是偶数则把 cnt[0] 增加 i
        // int cnt[2] = {0};
        // for(int i = 1; ; i++)
        // {
        //     cnt[i % 2] += i;

        //     // 说明这一层不够放了，要么不够放红，要么不够放蓝
        //     if((cnt[0] > red || cnt[1] > blue) && (cnt[0] > blue || cnt[1] > red))
        //         return i - 1;
        // }
        // return -1;

        // 解法二，数学公式
        // 设奇数行有 k 行，那么需要 1+3+5+⋯+(2k−1)=k²
        // 设偶数行有 k 行，那么需要 2+4+6+⋯+2k=k²+k
        auto f = [](int n, int m)->int{
            int odd = sqrt(n);
            int even = (sqrt(m * 4 + 1) - 1) / 2;
            return odd > even ? even * 2 + 1 : odd * 2;
        };
        return max(f(red, blue), f(blue, red));
    }
};